﻿#region Copyright (c) 2010 R. Uittenbosch
/*
* Copyright (C) 2010 R. Uittenbosch
* 
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 
* associated documentation files (the "Software"), to deal in the Software without restriction, including 
* without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
* copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the 
* following conditions:
* 
* The above copyright notice and this permission notice shall be included in all copies or substantial 
* portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 
* EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#endregion

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Mobile.Mvc;
using Microsoft.Practices.Mobile.ContainerModel;
using LinkedService.Mobile;
using System.Diagnostics;
using TouchUI.System.Mobile.Mvc;

namespace LinkedIn.Mobile
{

  /// <summary>
  /// Controller for the loginForm
  /// </summary>
  public class LoginController  : Controller<LoginModel>
  {

    /// <summary>
    /// Notify the view.
    /// </summary>
    [PublishEvent("OnModelUpdated")]
    public event EventHandler ModelUpdated;

    /// <summary>
    /// Constructor
    /// </summary>
    /// <param name="view"></param>
    public LoginController(IView<LoginModel> view) 
            : base(view)
        {
          model = new LoginModel();
        }

      private LoginModel model;
      public Container Container
      {
          get;
          set;
      }

      /// <summary>
      /// An exception occured..
      /// </summary>
      /// <param name="parameters"></param>
      /// <returns></returns>
      private bool CheckException(object[] parameters)
      {
        ErrorEventArgs e = this.GetFirstParameter<ErrorEventArgs>(parameters);    
          if (e != null)
          {
            model.ExceptionOccured = true;
            if (e.Exception != null)
              model.ExceptionMessage = e.Exception.Message;
            else
              model.ExceptionMessage = e.Message;
           
            return true;
          }
        return false;
      }

      /// <summary>
      /// Was it an authorization issue?
      /// </summary>
      /// <param name="parameters"></param>
      /// <returns></returns>
      private bool CheckAuthorizationIssue(object[] parameters)
      {
        ErrorEventArgs e = this.GetFirstParameter<ErrorEventArgs>(parameters);   
          if (e != null)
          {             
            if (!string.IsNullOrEmpty(e.AuthenticationUrl))
            {
              model.ExceptionOccured = false;
              model.AuthorizationURL = e.AuthenticationUrl;
                       
              return true;
            }
            if (e.Message == "retry")
            {
              model.ExceptionOccured = false;
              model.AuthorizationURL = string.Empty;
              return true;
            }
          }
        return false;
      }

    /// <summary>
    /// Notify the view that something changed
    /// </summary>
      private void NotifyView()
      {
        // Raise the event for view
        if (this.ModelUpdated != null)
        {
          this.ModelUpdated(this, EventArgs.Empty);
        }
      }


    /// <summary>
    /// Initialize the controller
    /// </summary>
    /// <param name="parameters"></param>
      protected override void OnInitialize(params object[] parameters)
      {
        if (!CheckAuthorizationIssue(parameters))

          if (!CheckException(parameters))
            model.Refresh = true;

        this.view.Model = model;
        this.NotifyView();
      }

      /// <summary>
      /// This method indicates that something has been changed in the view.
      /// </summary>
      /// <param name="key">The string key to identify what has been changed.</param>
      protected override void OnViewStateChanged(string key)
      {
        switch (key)
        {
            // Ok button pressed
          case "Ok":
            {
              // Remember the verifierCode
              string verifierCode = view.ViewData["VerifierCode"].ToString();
              if (!string.IsNullOrEmpty(verifierCode))
              {
                // No longer pending authentication
                ApplicationManager.Configuration.SetItem("AuthenticationPending", false);
                // Add the code to our service, and move to the mainform
                ApplicationManager.Service.Security.VerifyRequestToken(verifierCode);
                NavigatorService.Navigator.Navigate<MainFormController>();
              }
              break;
            }
          case "Visible":
            {
              if (!string.IsNullOrEmpty(model.AuthorizationURL))
              {

                if (!model.ExceptionOccured && !model.Refresh)
                {
                  // And start the default Webbrowser
                  Process.Start(new ProcessStartInfo()
                                  {
                                    UseShellExecute = true,
                                    FileName = model.AuthorizationURL
                                  }
                               );
                }
              }
              break;
            }
          default:
            {
              break;
            }
        }
      }
  }
}
